 /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package RRHH_controlador;

import CONTABILIDAD_MODELO.CON_DATOS_EMPRESA;
import CONTABILIDAD_MODELO.CON_MONEDA;
import Conexion.Conexion;
import RRHH_Modelo.RHH_BONO_ANTIGUEDAD;
import RRHH_Modelo.RHH_BONO_USUARIO;
import RRHH_Modelo.RHH_CANTIDAD_PRIMAS_PROVI;
import RRHH_Modelo.RHH_CREDITO_FISCAL;
import RRHH_Modelo.RHH_DEPARTAMENTO;
import RRHH_Modelo.RHH_EVENTOS_HITO;
import RRHH_Modelo.RHH_FECHAS_HITO;
import RRHH_Modelo.RHH_PERSONA;
import RRHH_Modelo.RHH_PLANILLA_EMPLEADOS;
import RRHH_Modelo.RHH_PLANILLA_PRIMA;
import RRHH_Modelo.RHH_PLANILLA_PRIMA_CABECE;
import RRHH_Modelo.RHH_REGIONAL;
import RRHH_Modelo.RHH_SALARIO_MINIMO;
import RRHH_Modelo.RHH_SUCURSAL;
import RRHH_Modelo.RHH_USUARIO;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author equipo_4
 */
@MultipartConfig
@WebServlet(name = "RRHH_PLANILLA_PRIMAS_CONTROLLER", urlPatterns = {"/RRHH_PLANILLA_PRIMAS_CONTROLLER"})
public class RRHH_PLANILLA_PRIMAS_CONTROLLER extends HttpServlet {

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            /* TODO output your page here. You may use following sample code. */
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet RRHH_PLANILLA_FINIQUITOS_CONTROLLER</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet RRHH_PLANILLA_FINIQUITOS_CONTROLLER at " + request.getContextPath() + "</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            RHH_USUARIO usuario = ((RHH_USUARIO) request.getSession().getAttribute("usr"));
            Conexion con = new Conexion(usuario.getUSUARIO(), usuario.getPASSWORD());
            String evento = request.getParameter("evento");
            String html = "";

            switch (evento) {
                case "cargarLista":
                    html = cargarLista(request, con);
                    break;
                case "mostrar":
                    html = mostrar(request, con);
                    break;                    
                case "nueva_planilla":
                    html = nueva_planilla(request, con);
                    break;                
                case "eliminar":
                    html = eliminar(request, con);
                    break;                                
                case "cerrar":
                    html = cerrar(request, con);
                    break;
                case "calcular_fila":
                    html = calcular_fila(request, con);
                    break;
                case "estado":
                    html = estado(request, con);
                    break;
            }
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/plain");
            response.getWriter().write(html);
            con.Close();
        } catch (SQLException ex) {
            Logger.getLogger(RRHH_PLANILLA_PRIMAS_CONTROLLER.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private String cargarLista(HttpServletRequest request, Conexion con) throws SQLException {
        int ano = Integer.parseInt(request.getParameter("ano"));
        String html="<ul>";
        List<RHH_PLANILLA_PRIMA_CABECE> lista_cabeceras = new RHH_PLANILLA_PRIMA_CABECE(con).BuscarXano(ano);
        for(RHH_PLANILLA_PRIMA_CABECE planilla:lista_cabeceras)
        {
            if(planilla.getESTADO()==0)
                html+="<li><a href='#' onclick='abrir("+planilla.getID()+");'>"+planilla.getDESCRIPCION_PAGO()+"</a></li>";
            else
                html+="<li><a href='#' onclick='abrir("+planilla.getID()+");'>"+planilla.getDESCRIPCION_PAGO()+"</a><a href='#' onclick='eliminar("+planilla.getID()+",this);'>(X)</a><a href='#' onclick='cerrar("+planilla.getID()+",this);'>(CERRAR)</a></li>";
        }
        return html+"</ul><button type='button' onclick='descripcion();'>NUEVA PLANILLA</button>";
    }        
    
    private String mostrar(HttpServletRequest request, Conexion con) throws SQLException {
        int id_planilla = Integer.parseInt(request.getParameter("id_planilla"));        

        RHH_PLANILLA_PRIMA_CABECE planilla = new RHH_PLANILLA_PRIMA_CABECE(con).Buscar(id_planilla);
        String html = "";
        if(planilla!=null)
        {
            html += "<thead>";
            html += "<tr>";                            
            if(planilla.getESTADO()!=0)
            {
                html += "<th rowspan='2'>SELECCIONAR</th>";
            }
            html += "<th rowspan='2'>CI</th>";
            html += "<th rowspan='2'>LUGAR DE EMISION</th>";
            html += "<th rowspan='2'>NOMBRES</th>";
            html += "<th rowspan='2'>APELLIDO PATERNO</th>";
            html += "<th rowspan='2'>APELLIDO MATERNO</th>";
            html += "<th rowspan='2'>FECHA CONTRATACION</th>";
            html += "<th rowspan='2'>FECHA RETIRO</th>";
            html += "<th colspan='3'>ANTIGUEDAD</th>";
            html += "<th rowspan='2'>CARGO</th>";
            html += "<th rowspan='2'>DEPARTAMENTO</th>";
            html += "<th rowspan='2'>REGIONAL</th>";
            html += "<th rowspan='2'>SUCURSAL</th>";
            html += "<th rowspan='2'>MESES TRABAJADOS AÑO ACTUAL</th>";
            html += "<th rowspan='2'>DIAS TRABAJADOS AÑO ACTUAL</th>";        
            html += "<th rowspan='2'>CANTIDAD DE PAGOS</th>";
            html += "<th rowspan='2'>MONTO</th>";
            html += "<th rowspan='2'>MONTO TOTAL</th>";
            html+="<th colspan='6'>APORTE LABORAL</th>";                        
            html+="<th colspan='5'>APORTE PATRONAL</th>";                        
            html+="<th rowspan='2'>SUELDO NETO SUJETO A IMPUESTOS</th>";
            html+="<th rowspan='2'>MINIMO NO IMPONIBLE</th>";
            html+="<th rowspan='2'>DIFERENCIA SUJETA A IMPUESTOS</th>";
            html+="<th rowspan='2'>IMPUESTO LIQUIDADO</th>";
            html+="<th rowspan='2'>COMPUTO IVA SIN DDJJ</th>";
            html+="<th rowspan='2'>13% SOBRE DOS SALARIOS MINIMOS</th>";
            html+="<th rowspan='2'>SALDO FAVOR IMPUESTOS</th>";
            html+="<th rowspan='2'>SALDO FAVOR EMPLEADO</th>";
            html+="<th rowspan='2'>SALDO MES ANTERIOR</th>";        
            html+="<th rowspan='2'>UFV MES ANTERIOR</th>";
            html+="<th rowspan='2'>UFV ACTUAL</th>";
            html+="<th rowspan='2'>ACTUALIZACION</th>";
            html+="<th rowspan='2'>SUB TOTAL i + j</th>";
            html+="<th rowspan='2'>SALDO TOTAL A FAVOR EMPLEADO</th>";
            html+="<th rowspan='2'>SALDO UTILIZADO</th>";
            html+="<th rowspan='2'>IMPUESTO RETENIDO A PAGAR</th>";
            html+="<th rowspan='2'>SALDO A FAVOR SIGTE MES</th>";
            html+="<th rowspan='2'>TOTAL DESCUENTO MES</th>";            
            html+="<th rowspan='2'>TOTAL LIQUIDO PAGABLE</th>";                
            html+="</tr>";                
            html+="<tr>";             
            html+="<th>DIA</th>";
            html+="<th>MES</th>";
            html+="<th>AÑO</th>";        
            html+="<th>SEGURO LARGO PLAZO</th>";
            html+="<th>RIESGO COMUN</th>";
            html+="<th>COMISION AFP</th>";
            html+="<th>SOLIDARIO ASEGURADO</th>";
            html+="<th>SOLIDARIO NACIONAL</th>";
            html+="<th>TOTAL APORTE LABORAL</th>";
            html+="<th>CSBP</th>";
            html+="<th>RIESGO PROFECIONAL</th>";
            html+="<th>PRO VIVIENDA</th>";
            html+="<th>APORTE SOLIDARIO</th>";
            html+="<th>TOTAL APORTE PATRONAL</th>";
            html+="</tr>";                
            html += "</thead>";
            html += "<tbody>";
            List<RHH_PLANILLA_PRIMA> lista_detalle = new RHH_PLANILLA_PRIMA(con).BuscarXmaestro(id_planilla);
            if(planilla.getESTADO()==0)
            {
                for (RHH_PLANILLA_PRIMA detalle : lista_detalle) {
                    if(detalle.getESTADO_PENDIENTES_PRIMA()==0)
                    {
                        RHH_PERSONA per = new RHH_PERSONA(con).BuscarxID_Usuario(detalle.getID_USUARIO());                
                        html += "<tr>";                                    
                        html += "<td>" + per.getCI() + "</td>";
                        html += "<td>" + per.getLUGAR_EMISION() + "</td>";
                        html += "<td>" + per.getPRIMER_NOMBRE() + " " + per.getSEGUNDO_NOMBRE() + "</td>";
                        html += "<td>" + per.getPRIMER_APELLIDO() + "</td>";
                        html += "<td>" + per.getSEGUNDO_APELLIDO() + "</td>";
                        html += "<td>" + detalle.getFECHA_INGRESO() + "</td>";
                        if (detalle.getFECHA_RETIRO() != null) {
                            html += "<td>" + detalle.getFECHA_RETIRO() + "</td>";
                        } else {
                            html += "<td></td>";
                        }
                        html += "<td>" + detalle.getANTIGUEDAD_DIA() + "</td>";
                        html += "<td>" + detalle.getANTIGUEDAD_MES() + "</td>";
                        html += "<td>" + detalle.getANTIGUEDAD_ANO() + "</td>";
                        String cargo = detalle.getCARGO();
                        cargo = cargo==null?"":cargo;
                        html += "<td>" + cargo + "</td>";

                        String depto = "***";
                        int id_deto=detalle.getDEPARTAMENTO();
                        if(id_deto!=0)
                            depto = new RHH_DEPARTAMENTO(con).BuscarXid(id_deto).getDESCRIPCION();
                        html += "<td>" + depto + "</td>";

                        String reg = "***";
                        int id_reg=detalle.getREGIONAL();
                        if(id_reg!=0)
                            reg = new RHH_REGIONAL(con).BuscarXid(id_reg).getDESCRIPCION();                
                        html += "<td>" + reg + "</td>";

                        String suc = "***";
                        int id_suc=detalle.getSUCURSAL();
                        if(id_suc!=0)
                            suc = new RHH_SUCURSAL(con).BuscarXid(id_suc).getDESCRIPCION();                
                        html += "<td>" + suc + "</td>";

                        html += "<td>" + detalle.getMESES_TRABAJADOS_ANO_ACTUAL() + "</td>";
                        html += "<td>" + detalle.getDIAS_TRABAJADOS_ANO_ACTUAL() + "</td>";

                        html += "<td>" + detalle.getCANTIDAD_PAGOS() + "</td>";

                        html += "<td>" + detalle.getMONTO()+ "</td>";
                        html += "<td>" + detalle.getMONTO_TOTAL() + "</td>";


                        html+="<td>"+detalle.getSEGURO_LARGO_PLAZO()+"</td>";
                        html+="<td>"+detalle.getRIESGO_COMUN()+"</td>";
                        html+="<td>"+detalle.getRIESGO_PROFESIONAL()+"</td>";
                        html+="<td>"+detalle.getSOLIDARIO_ASEGURADO()+"</td>";
                        html+="<td>"+detalle.getSOLIDARIO_NACIONAL()+"</td>";
                        html+="<td>"+detalle.getTOTAL_APORTE_LABORAL()+"</td>";
                        html+="<td>"+detalle.getCSBP()+"</td>";
                        html+="<td>"+detalle.getRIESGO_PROFESIONAL()+"</td>";
                        html+="<td>"+detalle.getPRO_VIVIENDA()+"</td>";
                        html+="<td>"+detalle.getAPORTE_SOLIDARIO()+"</td>";
                        html+="<td>"+detalle.getTOTAL_APORTE_PATRONAL()+"</td>";
                        html+="<td>"+detalle.getMONTO_NETO_SUJ_IMPUESTOS()+"</td>";
                        html+="<td>"+detalle.getMINIMO_NO_IMPONIBLE()+"</td>";
                        html+="<td>"+detalle.getDIFERENCIA_SUJETA_IMPUESTOS()+"</td>";
                        html+="<td>"+detalle.getIMPUESTO_LIQUIDADO()+"</td>";            

                        html+="<td>"+detalle.getCOMPUTO_IVA()+"</td>";

                        html+="<td>"+detalle.getSOBRE_2_SALARIOS_MINIMOS()+"</td>";
                        html+="<td>"+detalle.getSALDO_FAVOR_IMPUESTOS()+"</td>";
                        html+="<td>"+detalle.getSALDO_FAVOR_EMPLEADOS()+"</td>";

                        html+="<td>"+detalle.getSALDO_MES_ANTERIOR()+"</td>";
                        html+="<td>"+detalle.getUFV_MES_PASADO()+"</td>";
                        html+="<td>"+detalle.getUFV_ACTUAL()+"</td>";

                        html+="<td>"+detalle.getACTUALIZACION()+"</td>";                
                        html+="<td>"+detalle.getSUB_TOTAL()+"</td>";
                        html+="<td>"+detalle.getSALDO_TOTAL_FAVOR_EMPLEADO()+"</td>";               
                        html+="<td>"+detalle.getSALDO_UTILIZADO()+"</td>";                
                        html+="<td>"+detalle.getIMPUESTO_RETENIDO_PAGAR()+"</td>";                
                        html+="<td>"+detalle.getSALDO_FAVOR_SIGUIENTE_MES()+"</td>";                
                        html+="<td>"+detalle.getTOTAL_DESCUENTO_MES()+"</td>";                
                        html+="<td>"+detalle.getTOTAL_LIQUIDO_PAGABLE()+"</td>";
                        html += "</tr>";
                    }
                }
            }
            else
            {
                for (RHH_PLANILLA_PRIMA detalle : lista_detalle) {
                    RHH_PERSONA per = new RHH_PERSONA(con).BuscarxID_Usuario(detalle.getID_USUARIO());                
                    html += "<tr>";                
                    if(detalle.getESTADO_PENDIENTES_PRIMA()==1)
                        html += "<td><input type='checkbox' onclick='estado("+detalle.getID()+");'/></td>";
                    else
                        html += "<td><input type='checkbox' onclick='estado("+detalle.getID()+");' checked/></td>";
                    html += "<td>" + per.getCI() + "</td>";
                    html += "<td>" + per.getLUGAR_EMISION() + "</td>";
                    html += "<td>" + per.getPRIMER_NOMBRE() + " " + per.getSEGUNDO_NOMBRE() + "</td>";
                    html += "<td>" + per.getPRIMER_APELLIDO() + "</td>";
                    html += "<td>" + per.getSEGUNDO_APELLIDO() + "</td>";
                    html += "<td>" + detalle.getFECHA_INGRESO() + "</td>";
                    if (detalle.getFECHA_RETIRO() != null) {
                        html += "<td>" + detalle.getFECHA_RETIRO() + "</td>";
                    } else {
                        html += "<td></td>";
                    }
                    html += "<td>" + detalle.getANTIGUEDAD_DIA() + "</td>";
                    html += "<td>" + detalle.getANTIGUEDAD_MES() + "</td>";
                    html += "<td>" + detalle.getANTIGUEDAD_ANO() + "</td>";
                    String cargo = detalle.getCARGO();
                    cargo = cargo==null?"":cargo;
                    html += "<td>" + cargo + "</td>";

                    String depto = "***";
                    int id_deto=detalle.getDEPARTAMENTO();
                    if(id_deto!=0)
                        depto = new RHH_DEPARTAMENTO(con).BuscarXid(id_deto).getDESCRIPCION();
                    html += "<td>" + depto + "</td>";

                    String reg = "***";
                    int id_reg=detalle.getREGIONAL();
                    if(id_reg!=0)
                        reg = new RHH_REGIONAL(con).BuscarXid(id_reg).getDESCRIPCION();                
                    html += "<td>" + reg + "</td>";

                    String suc = "***";
                    int id_suc=detalle.getSUCURSAL();
                    if(id_suc!=0)
                        suc = new RHH_SUCURSAL(con).BuscarXid(id_suc).getDESCRIPCION();                
                    html += "<td>" + suc + "</td>";

                    html += "<td>" + detalle.getMESES_TRABAJADOS_ANO_ACTUAL() + "</td>";
                    html += "<td>" + detalle.getDIAS_TRABAJADOS_ANO_ACTUAL() + "</td>";
                    
                    html += "<td><input type='number' value='" + detalle.getCANTIDAD_PAGOS() + "' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");'/></td>";                
                    

                    html += "<td>" + detalle.getMONTO()+ "</td>";
                    html += "<td>" + detalle.getMONTO_TOTAL() + "</td>";


                    html+="<td>"+detalle.getSEGURO_LARGO_PLAZO()+"</td>";
                    html+="<td>"+detalle.getRIESGO_COMUN()+"</td>";
                    html+="<td>"+detalle.getRIESGO_PROFESIONAL()+"</td>";
                    html+="<td>"+detalle.getSOLIDARIO_ASEGURADO()+"</td>";
                    html+="<td>"+detalle.getSOLIDARIO_NACIONAL()+"</td>";
                    html+="<td>"+detalle.getTOTAL_APORTE_LABORAL()+"</td>";
                    html+="<td>"+detalle.getCSBP()+"</td>";
                    html+="<td>"+detalle.getRIESGO_PROFESIONAL()+"</td>";
                    html+="<td>"+detalle.getPRO_VIVIENDA()+"</td>";
                    html+="<td>"+detalle.getAPORTE_SOLIDARIO()+"</td>";
                    html+="<td>"+detalle.getTOTAL_APORTE_PATRONAL()+"</td>";
                    html+="<td>"+detalle.getMONTO_NETO_SUJ_IMPUESTOS()+"</td>";
                    html+="<td>"+detalle.getMINIMO_NO_IMPONIBLE()+"</td>";
                    html+="<td>"+detalle.getDIFERENCIA_SUJETA_IMPUESTOS()+"</td>";
                    html+="<td>"+detalle.getIMPUESTO_LIQUIDADO()+"</td>";
                    
                    html+="<td><input type='number' data-id='"+detalle.getID()+"' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");' value='"+detalle.getCOMPUTO_IVA()+"' min='0'/> </td>";

                    html+="<td>"+detalle.getSOBRE_2_SALARIOS_MINIMOS()+"</td>";
                    html+="<td>"+detalle.getSALDO_FAVOR_IMPUESTOS()+"</td>";
                    html+="<td>"+detalle.getSALDO_FAVOR_EMPLEADOS()+"</td>";

                        html+="<td><input type='number' data-id='"+detalle.getID()+"' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");' value='"+detalle.getSALDO_MES_ANTERIOR()+"' min='0'/></td>";
                        html+="<td><input type='number' data-id='"+detalle.getID()+"' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");' value='"+detalle.getUFV_MES_PASADO()+"' min='0'/></td>";
                        html+="<td><input type='number' data-id='"+detalle.getID()+"' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");' value='"+detalle.getUFV_ACTUAL()+"' min='0'/></td>";

                    html+="<td>"+detalle.getACTUALIZACION()+"</td>";   
                    html+="<td>"+detalle.getSUB_TOTAL()+"</td>";
                    html+="<td>"+detalle.getSALDO_TOTAL_FAVOR_EMPLEADO()+"</td>";
                    html+="<td>"+detalle.getSALDO_UTILIZADO()+"</td>";
                    html+="<td>"+detalle.getIMPUESTO_RETENIDO_PAGAR()+"</td>";
                    html+="<td>"+detalle.getSALDO_FAVOR_SIGUIENTE_MES()+"</td>";
                    html+="<td>"+detalle.getTOTAL_DESCUENTO_MES()+"</td>";
                    html+="<td>"+detalle.getTOTAL_LIQUIDO_PAGABLE()+"</td>";
                    html += "</tr>";
                }
            }
            html += "</tbody>";
            return html;
        }
        else
            return "";
    }
    
    private String cerrar(HttpServletRequest request, Conexion con) throws SQLException {
        int id_planilla = Integer.parseInt(request.getParameter("id_p"));
        RHH_PLANILLA_PRIMA_CABECE planilla = new RHH_PLANILLA_PRIMA_CABECE(con).Buscar(id_planilla);                
        if(planilla!=null)
        {
            List<RHH_PLANILLA_PRIMA> lista = new RHH_PLANILLA_PRIMA(con).BuscarXmaestro(planilla.getID());
            for(RHH_PLANILLA_PRIMA detalle:lista)
            {
                if(detalle.getESTADO_PENDIENTES_PRIMA()==0)
                {
                    double debito = detalle.getIMPUESTO_RETENIDO_PAGAR();
                    double credito = detalle.getSALDO_FAVOR_SIGUIENTE_MES();
                    RHH_CREDITO_FISCAL credito_fiscal = new RHH_CREDITO_FISCAL(con);
                    credito_fiscal.setID_USUARIO(detalle.getID_USUARIO());
                    credito_fiscal.setDEBITO(debito);
                    credito_fiscal.setCREDITO(credito);
                    credito_fiscal.Insertar();
                    if(debito>credito)
                    {
                        double resto = debito-credito;
                        credito_fiscal.setCREDITO(resto);
                        credito_fiscal.setDEBITO(0);
                        credito_fiscal.Insertar();
                    }
                }
            }
            planilla.cerrar();
            return "<a href='#' onclick='abrir("+planilla.getID()+");'>"+planilla.getDESCRIPCION_PAGO()+"</a>";
        }        
        else
            return "ERROR EN LA PLANILLA";
    }
    
    
    private String nueva_planilla(HttpServletRequest request, Conexion con) throws SQLException {
        con.Transacction();
        try
        {
            String descripcion = request.getParameter("desc");
            int ano = Integer.parseInt(request.getParameter("ano"));

            RHH_CANTIDAD_PRIMAS_PROVI cant = new RHH_CANTIDAD_PRIMAS_PROVI(con).Buscar(ano);                 
            String consulta1 =   "SELECT max(RHH_PLANILLA_PRIMA_CABECE.NUMERO_PAGO) numero \n" +
                                "  FROM BROKER.RHH_PLANILLA_PRIMA_CABECE\n" +
                                " WHERE RHH_PLANILLA_PRIMA_CABECE.ANO_PAGADO = "+ano;
            ResultSet rs1 = con.EjecutarConsulta(consulta1);

            int numero =0;
            if(rs1.next())
                numero=rs1.getInt("NUMERO");

            if(cant!=null)
            {
                Date hoy = new Date();
                RHH_PLANILLA_PRIMA_CABECE planilla = new RHH_PLANILLA_PRIMA_CABECE(0, 1, ano, hoy, descripcion, (numero+1));
                planilla.setCon(con);
                int id_planilla = planilla.Insertar();

                int cant_pagos=1;
                RHH_CANTIDAD_PRIMAS_PROVI cap = new RHH_CANTIDAD_PRIMAS_PROVI(con).Buscar(ano);
                if(cap!=null)
                    cant_pagos=cap.getCANTIDAD();



                List<RHH_USUARIO> lista = new RHH_USUARIO(con).TodosPlanillaAAnual(ano);
                for (RHH_USUARIO usr : lista) {
                    String consulta = "SELECT RHH_PERSONA.CI,\n"
                            + "       RHH_PERSONA.LUGAR_EMISION,\n"
                            + "       RHH_PERSONA.PRIMER_NOMBRE,\n"
                            + "       RHH_PERSONA.SEGUNDO_NOMBRE,\n"
                            + "       RHH_PERSONA.PRIMER_APELLIDO,\n"
                            + "       RHH_PERSONA.SEGUNDO_APELLIDO,\n"
                            + "       RHH_DEPARTAMENTO.ID AS DEPTO,\n"
                            + "       RHH_REGIONAL.ID AS REGIONAL,\n"
                            + "       RHH_SUCURSAL.ID AS SUCURSAL,\n"
                            + "       RHH_CARGO.ID AS CARGO,\n"
                            + "       RHH_USUARIO.ID\n"
                            + "  FROM BROKER.RHH_USUARIO,\n"
                            + "       BROKER.RHH_CARGO,\n"
                            + "       BROKER.RHH_CARGO_DEP_REG_SUC,\n"
                            + "       BROKER.RHH_DEPARTAMENTO,\n"
                            + "       BROKER.RHH_REGIONAL,\n"
                            + "       BROKER.RHH_SUCURSAL,\n"
                            + "       BROKER.RHH_PERSONA\n"
                            + " WHERE     (RHH_USUARIO.ID_CARGO = RHH_CARGO.ID)\n"
                            + "       AND (RHH_CARGO_DEP_REG_SUC.ID_CARGO = RHH_CARGO.ID)\n"
                            + "       AND (RHH_USUARIO.ID_PERSONA = RHH_PERSONA.ID)\n"
                            + "       AND (RHH_CARGO_DEP_REG_SUC.ID_DEPTO = RHH_DEPARTAMENTO.ID(+))\n"
                            + "       AND (RHH_CARGO_DEP_REG_SUC.ID_REGIONAL = RHH_REGIONAL.ID(+))\n"
                            + "       AND (RHH_CARGO_DEP_REG_SUC.ID_SUCURSAL = RHH_SUCURSAL.ID(+))\n"
                            + "       AND (RHH_USUARIO.ID = " + usr.getID() + ")";
                    ResultSet rs = con.EjecutarConsulta(consulta);                

                    if (rs.next()) {
                        RHH_PLANILLA_PRIMA detalle = new RHH_PLANILLA_PRIMA(con);
                        RHH_FECHAS_HITO fecha_hito = new RHH_FECHAS_HITO(con).BuscarxUsuarioEvento(3, usr.getID());
                        Date ingreso = fecha_hito.getFECHAinDate();
                        Calendar ingreso_empresa = new GregorianCalendar();
                        ingreso_empresa.setTime(ingreso);

                        Calendar calendario = new GregorianCalendar();
                        calendario.set(Calendar.HOUR_OF_DAY, 0);
                        calendario.set(Calendar.MINUTE, 0);
                        calendario.set(Calendar.SECOND, 0);

                        if(ingreso_empresa.get(Calendar.YEAR)==ano)
                        {
                            calendario=ingreso_empresa;
                            if(calendario.get(Calendar.DAY_OF_MONTH)==1 && calendario.get(Calendar.MONTH)==0)
                                calendario.add(Calendar.DAY_OF_MONTH, -1);
                        }
                        else
                        {
                            calendario.set(Calendar.YEAR, ano);
                            calendario.set(Calendar.MONTH, 0);
                            calendario.set(Calendar.DAY_OF_MONTH, 1);                        
                            calendario.add(Calendar.DAY_OF_MONTH, -1);
                        }                                        



                        int anof = 0;
                        int mesf = 0;
                        int diaf = 0;

                        int dias_trabajados = 0;
                        if (ingreso != null) {
                            Date fecha1 = calendario.getTime();
                            Calendar final_de_ano = new GregorianCalendar();
                            final_de_ano.set(Calendar.YEAR, ano);
                            final_de_ano.set(Calendar.MONTH, 11);
                            final_de_ano.set(Calendar.DAY_OF_MONTH, 31);
                            final_de_ano.set(Calendar.HOUR_OF_DAY, 0);
                            final_de_ano.set(Calendar.MINUTE, 0);
                            final_de_ano.set(Calendar.SECOND, 0);


                            Calendar fecha_actual = new GregorianCalendar();
                            fecha_actual.set(Calendar.HOUR_OF_DAY, 0);
                            fecha_actual.set(Calendar.MINUTE, 0);
                            fecha_actual.set(Calendar.SECOND, 0);

                            Date fecha2=null;
                            if(fecha_actual.before(final_de_ano))
                                fecha2=fecha_actual.getTime();
                            else
                                fecha2=final_de_ano.getTime();

                            long diferencia = fecha2.getTime() - fecha1.getTime();
                            int dia = (int) (diferencia / (3600000 * 24));
                            dias_trabajados = dia;
                            calendario.add(Calendar.DAY_OF_MONTH, dia);
                            if (dia < 365) {
                                anof = 0;
                            } else {
                                anof = calendario.get(Calendar.YEAR);
                            }

                            mesf = calendario.get(Calendar.MONTH);
                            diaf = calendario.get(Calendar.DAY_OF_MONTH);
                        }

                        calendario.set(Calendar.YEAR, 0);
                        calendario.set(Calendar.MONTH, 0);
                        calendario.set(Calendar.DAY_OF_MONTH, 1);

                        if (ingreso != null) {
                            Date fecha1 = ingreso;
                            Date fecha2 = new GregorianCalendar().getTime();
                            long diferencia = fecha2.getTime() - fecha1.getTime();
                            int dia = (int) (diferencia / (3600000 * 24));                        
                            calendario.add(Calendar.DAY_OF_MONTH, dia);
                            if (dia < 365) {
                                anof = 0;
                            } else {
                                anof = calendario.get(Calendar.YEAR);
                            }

                            mesf = calendario.get(Calendar.MONTH);
                            diaf = calendario.get(Calendar.DAY_OF_MONTH);
                        }

                        Calendar fecha_in = new GregorianCalendar();
                        fecha_in.setTime(ingreso);

                        Calendar calcular_ini = new GregorianCalendar();
                        if (fecha_in.get(Calendar.YEAR) < ano) {
                            calcular_ini.set(Calendar.YEAR, ano);
                            calcular_ini.set(Calendar.MONTH, 0);
                            calcular_ini.set(Calendar.DAY_OF_MONTH, 1);
                        } else {
                            calcular_ini.set(Calendar.YEAR, ano);
                            calcular_ini.set(Calendar.MONTH, fecha_in.get(Calendar.MONTH));
                            calcular_ini.set(Calendar.DAY_OF_MONTH, fecha_in.get(Calendar.DAY_OF_MONTH));
                        }                   

                        if (dias_trabajados >= 90) {
                            detalle.setID_USUARIO(usr.getID());                        

                            if (fecha_hito != null) {                            
                                detalle.setFECHA_INGRESO(ingreso);
                            }

                            fecha_hito = new RHH_FECHAS_HITO(con).retiro(usr.getID());
                            if (fecha_hito != null) {                            
                                detalle.setFECHA_RETIRO(fecha_hito.getFECHAinDate());                                                        
                            }

                            detalle.setANTIGUEDAD_DIA(diaf);                        
                            detalle.setANTIGUEDAD_MES(mesf);                        
                            detalle.setANTIGUEDAD_ANO(anof);

                            String cargo = rs.getString("CARGO");
                            cargo = cargo == null ? "" : cargo;                        
                            detalle.setCARGO(cargo);                                                

                            int id_depto = rs.getInt("DEPTO");
                            String depto = "***";
                            if(id_depto!=0)
                                depto = new RHH_DEPARTAMENTO(con).BuscarXid(id_depto).getDESCRIPCION();
                            detalle.setDEPARTAMENTO(id_depto);

                            int id_reg = rs.getInt("REGIONAL");
                            String regional = "***";
                            if(id_reg!=0)
                                regional = new RHH_REGIONAL(con).BuscarXid(id_reg).getDESCRIPCION();
                            detalle.setREGIONAL(id_reg);

                            int id_suc = rs.getInt("SUCURSAL");
                            String sucursal = "***";
                            if(id_suc!=0)
                                sucursal = new RHH_SUCURSAL(con).BuscarXid(id_suc).getDESCRIPCION();
                            detalle.setSUCURSAL(id_suc);

                            Calendar tiempo_tabajado = new GregorianCalendar();
                            tiempo_tabajado.set(Calendar.YEAR, 0);
                            tiempo_tabajado.set(Calendar.MONTH, 0);
                            tiempo_tabajado.set(Calendar.DAY_OF_MONTH, 1);


                            tiempo_tabajado.add(Calendar.DAY_OF_MONTH, dias_trabajados);
                            int meses_trabajados = tiempo_tabajado.get(Calendar.MONTH);
                            int dias_trabajado = tiempo_tabajado.get(Calendar.DAY_OF_MONTH);

                            detalle.setMESES_TRABAJADOS_ANO_ACTUAL(meses_trabajados);                        
                            detalle.setDIAS_TRABAJADOS_ANO_ACTUAL(dias_trabajado);                        
                            detalle.setID_PRIMA_CABECERA(id_planilla);                                                                 

                            Calendar fecha_planilla = new GregorianCalendar();
                            fecha_planilla.set(Calendar.YEAR, ano);
                            fecha_planilla.set(Calendar.MONTH, 11);

                            fecha_planilla.add(Calendar.MONTH, -2);

                            double salario1 = 0.0;
                            double salario2 = 0.0;
                            double salario3 = 0.0;

                            RHH_PLANILLA_EMPLEADOS planilla_empleados = new RHH_PLANILLA_EMPLEADOS(con).BuscarCerradaxUSUARIO(fecha_planilla.get(Calendar.YEAR), (fecha_planilla.get(Calendar.MONTH)+1), usr.getID());

                            if (planilla_empleados != null) {
                                salario1 = planilla_empleados.getTOTAL_GANADO();
                            }

                            fecha_planilla.add(Calendar.MONTH, 1);
                            planilla_empleados = new RHH_PLANILLA_EMPLEADOS(con).BuscarCerradaxUSUARIO(fecha_planilla.get(Calendar.YEAR), fecha_planilla.get(Calendar.MONTH)+1, usr.getID());

                            if (planilla_empleados != null) {
                                salario2 = planilla_empleados.getTOTAL_GANADO();
                            }

                            fecha_planilla.add(Calendar.MONTH, 1);
                            planilla_empleados = new RHH_PLANILLA_EMPLEADOS(con).BuscarCerradaxUSUARIO(fecha_planilla.get(Calendar.YEAR), fecha_planilla.get(Calendar.MONTH)+1, usr.getID());

                            if (planilla_empleados != null) {
                                salario3 = planilla_empleados.getTOTAL_GANADO();
                            }
                            else
                            {                        
                                double sueldo = new RHH_FECHAS_HITO(con).salarioUsuario(detalle.getID_USUARIO());
                                RHH_BONO_ANTIGUEDAD banti = new RHH_BONO_ANTIGUEDAD(con).sacarPorcentaje(anof);
                                double porcentaje_antiguedad = banti.getPORCENTAJE()/100;

                                List<RHH_BONO_USUARIO> otros_Ingresos = new RHH_BONO_USUARIO(con).TodosxUsuarioconImpuesto(detalle.getID_USUARIO());
                                double otro_ingreso=0.0;
                                Calendar fecha_actual = new GregorianCalendar();
                                fecha_actual.set(Calendar.YEAR,ano);
                                fecha_actual.set(Calendar.MONTH,11);
                                for(RHH_BONO_USUARIO bono:otros_Ingresos)
                                {            
                                    SimpleDateFormat formatomy = new SimpleDateFormat("MM/yyyy");
                                    Calendar calini = new GregorianCalendar();
                                    Calendar califin = new GregorianCalendar();
                                    calini.setTime(bono.getFECHA_INId());
                                    califin.setTime(bono.getFECHA_FINd());            

                                    boolean ok = false;
                                    while(calini.before(califin)||calini.equals(califin))
                                    {
                                        String fechaini = formatomy.format(calini.getTime());
                                        String fechaact = formatomy.format(fecha_actual.getTime());
                                        if(fechaini.equals(fechaact))
                                        {
                                            ok=true;
                                            break;
                                        }
                                        calini.add(Calendar.MONTH, 1);                   
                                    }

                                    if(ok)
                                    {                        
                                        otro_ingreso +=bono.getMONTO();                                
                                    }                                                               
                                }

                                List<RHH_BONO_USUARIO> otros_Ingresos_sin_imp = new RHH_BONO_USUARIO(con).TodosxUsuarioSinImpuesto(detalle.getID_USUARIO());
                                double otro_ingreso_sin_imp=0.0;
                                for(RHH_BONO_USUARIO bono:otros_Ingresos_sin_imp)
                                {
                                    SimpleDateFormat formatomy = new SimpleDateFormat("MM/yyyy");
                                    Calendar calini = new GregorianCalendar();
                                    Calendar califin = new GregorianCalendar();
                                    calini.setTime(bono.getFECHA_INId());
                                    califin.setTime(bono.getFECHA_FINd());            

                                    Calendar actual = new GregorianCalendar();
                                    boolean ok = false;
                                    while(calini.before(califin)||calini.equals(califin))
                                    {
                                        String fechaini = formatomy.format(calini.getTime());
                                        String fechaact = formatomy.format(actual.getTime());
                                        if(fechaini.equals(fechaact))
                                        {
                                            ok=true;
                                            break;
                                        }
                                        calini.add(Calendar.MONTH, 1);                   
                                    }

                                    if(ok)
                                    {
                                        otro_ingreso_sin_imp +=bono.getMONTO();                                
                                    }                                                               
                                }       

                                CON_DATOS_EMPRESA datos_empresa = new CON_DATOS_EMPRESA(con).Buscar();
                                int multiplic = datos_empresa.getBONO_ANTIGUEDAD();
                                double salariominimo_nal = new RHH_SALARIO_MINIMO(con).salarioActual();

                                double Bono_Antiguedad = porcentaje_antiguedad*(multiplic*salariominimo_nal); 

                                double total_ganado = sueldo+Bono_Antiguedad+otro_ingreso;                        

                                salario3=total_ganado;                        
                            }   
                            CON_DATOS_EMPRESA datos_empresa = new CON_DATOS_EMPRESA(con).Buscar();
                            double salariominimo_nal = new RHH_SALARIO_MINIMO(con).salarioActual();
                            int ano_comercial = new CON_DATOS_EMPRESA(con).Buscar().getANO_COMERCIAL();                        
                                if(dias_trabajados>ano_comercial)
                                    dias_trabajados=ano_comercial;


                            double monto_pagar=(((salario1+salario2+salario3)/3)*dias_trabajados)/ano_comercial;                        
                            detalle.setMONTO(monto_pagar);
                            double total_monto_a_pagar = cant_pagos*monto_pagar;
                            detalle.setCANTIDAD_PAGOS(cant_pagos);    
                            detalle.setMONTO_TOTAL(total_monto_a_pagar);                        

                            double total_ganado_sin_imp = monto_pagar;

                            double porc_largo_plazo=0.0;
                            int usuario_estado = usr.getESTADO();
                            if(usuario_estado==0||usuario_estado==1)
                                porc_largo_plazo = datos_empresa.getPORCENTAJE_LARGO_PLAZO();
                            if(usuario_estado==3 ||usuario_estado==4)
                                porc_largo_plazo = datos_empresa.getPORCENTAJE_JUBILADOS();

                            double seguro_largo_plazo=total_ganado_sin_imp*(porc_largo_plazo/100);            
                            detalle.setSEGURO_LARGO_PLAZO(seguro_largo_plazo);

                            double porc_riesgo_comun = datos_empresa.getPORCENTAJE_RIESGO_COMUN();
                            double riesgo_comun=total_ganado_sin_imp*(porc_riesgo_comun/100);            
                            detalle.setRIESGO_COMUN(riesgo_comun);

                            double porc_afp = datos_empresa.getPORCENTAJE_COMISION_AFP();
                            double afp=total_ganado_sin_imp*(porc_afp/100);            
                            detalle.setCOMISION_AFP(afp);

                            double porc_solidario_asegurado = datos_empresa.getPORCENTAJE_SOLIDARIO();
                            double solidario_asegurado=total_ganado_sin_imp*(porc_solidario_asegurado/100);            
                            detalle.setSOLIDARIO_ASEGURADO(solidario_asegurado);

                            double monto_SNA = datos_empresa.getMONTO_SOLIDARIO_NAC_A();
                            double monto_SNB = datos_empresa.getMONTO_SOLIDARIO_NAC_B();
                            double monto_SNC = datos_empresa.getMONTO_SOLIDARIO_NAC_C();
                            double porc_SNA = datos_empresa.getPORCENTAJE_SOLIDARIO_NAC_A();
                            double porc_SNB = datos_empresa.getPORCENTAJE_SOLIDARIO_NAC_B();
                            double porc_SNC = datos_empresa.getPORCENTAJE_SOLIDARIO_NAC_C();

                            double solidarion_nacional=0.0;

                            if(total_ganado_sin_imp>=monto_SNA && total_ganado_sin_imp<monto_SNB)
                            {
                                solidarion_nacional=(total_ganado_sin_imp-monto_SNA)*(porc_SNA/100);
                            }
                            if(total_ganado_sin_imp>=monto_SNB&&total_ganado_sin_imp<monto_SNC)
                            {
                                solidarion_nacional=(total_ganado_sin_imp-monto_SNA)*(porc_SNA/100);
                                solidarion_nacional+=(total_ganado_sin_imp-monto_SNB)*(porc_SNB/100);
                            }
                            if(total_ganado_sin_imp>=monto_SNC)
                            {
                                solidarion_nacional=(total_ganado_sin_imp-monto_SNA)*(porc_SNA/100);
                                solidarion_nacional+=(total_ganado_sin_imp-monto_SNB)*(porc_SNB/100);
                                solidarion_nacional+=(total_ganado_sin_imp-monto_SNC)*(porc_SNC/100);
                            }

                            detalle.setSOLIDARIO_NACIONAL(solidarion_nacional);

                            Double total_aporte_laboral = seguro_largo_plazo+riesgo_comun+afp+solidario_asegurado+solidarion_nacional;            
                            detalle.setTOTAL_APORTE_LABORAL(total_aporte_laboral);

                            double porc_csbp = datos_empresa.getPORCENTAJE_CSBP_SEG_MED();
                            double csbp=total_ganado_sin_imp*(porc_csbp/100);            
                            detalle.setCSBP(csbp);

                            double porc_afp_pro = datos_empresa.getPORCENTAJE_RISEGO_PROFESIONAL();
                            double afp_pro=total_ganado_sin_imp*(porc_afp_pro/100);            
                            detalle.setRIESGO_PROFESIONAL(afp_pro);

                            double porc_aporte_pro = datos_empresa.getPORCENTAJE_APORTE_PRO();
                            double aporte_pro=total_ganado_sin_imp*(porc_aporte_pro/100);            
                            detalle.setPRO_VIVIENDA(aporte_pro);

                            double porc_aporte_solidario = datos_empresa.getPORCENTAJE_SOLIDARIO();
                            double aporte_solidario=total_ganado_sin_imp*(porc_aporte_solidario/100);            
                            detalle.setAPORTE_SOLIDARIO(aporte_solidario);

                            double total_aporte_patronal = csbp+afp_pro+aporte_pro+aporte_solidario;            
                            detalle.setTOTAL_APORTE_PATRONAL(total_aporte_patronal);

                            double salario_neto_sujeto_imp = total_ganado_sin_imp-total_aporte_laboral;            
                            detalle.setMONTO_NETO_SUJ_IMPUESTOS(salario_neto_sujeto_imp);

                            double minimo_moinmp=salariominimo_nal*2;

                            if(minimo_moinmp>=salario_neto_sujeto_imp)
                                minimo_moinmp=salario_neto_sujeto_imp;            
                            detalle.setMINIMO_NO_IMPONIBLE(minimo_moinmp);

                            double dif_sujeta_impuestos= salario_neto_sujeto_imp-minimo_moinmp;            
                            detalle.setDIFERENCIA_SUJETA_IMPUESTOS(dif_sujeta_impuestos);

                            double imp_liquidado = dif_sujeta_impuestos*0.13;            
                            detalle.setIMPUESTO_LIQUIDADO(imp_liquidado);

                            double computo_iva_ddj=0;
                            detalle.setCOMPUTO_IVA(computo_iva_ddj);

                            double sobre_dos_salarios_minimos= 0.0;
                            if(dif_sujeta_impuestos!=0)
                            {
                                if(imp_liquidado<(0.13*(salariominimo_nal*2)))
                                    sobre_dos_salarios_minimos=imp_liquidado;
                                else
                                    sobre_dos_salarios_minimos=(0.13*(salariominimo_nal*2));
                            }            
                            detalle.setSOBRE_2_SALARIOS_MINIMOS(sobre_dos_salarios_minimos);


                            double saldo_favor =0.0;
                            if((imp_liquidado-computo_iva_ddj-sobre_dos_salarios_minimos)<0)
                                saldo_favor=0.0;
                            else
                                saldo_favor=(imp_liquidado-computo_iva_ddj-sobre_dos_salarios_minimos);            
                            detalle.setSALDO_FAVOR_IMPUESTOS(saldo_favor);

                            double saldo_favor_empleado=0.0;
                            if(sobre_dos_salarios_minimos>imp_liquidado)
                                saldo_favor_empleado=0.0;
                            else
                            {
                                if(sobre_dos_salarios_minimos+computo_iva_ddj-imp_liquidado<0)
                                    saldo_favor_empleado=0.0;
                                else
                                    saldo_favor_empleado=sobre_dos_salarios_minimos+computo_iva_ddj-imp_liquidado;
                            }            
                            detalle.setSALDO_FAVOR_EMPLEADOS(saldo_favor_empleado);

                            Calendar fecha_anterior = new GregorianCalendar();
                            fecha_anterior.add(Calendar.MONTH, -1);
                            int ano_anterior=fecha_anterior.get(Calendar.YEAR);
                            int mes_anterior=fecha_anterior.get(Calendar.MONTH)+1;
                            RHH_PLANILLA_EMPLEADOS planilla_anterior=new RHH_PLANILLA_EMPLEADOS(con).BuscarxUSUARIO(ano_anterior, mes_anterior, usr.getID());

                            double saldo_mes_anterior=new RHH_CREDITO_FISCAL(con).MontoActual(usr.getID());
                            detalle.setSALDO_MES_ANTERIOR(saldo_mes_anterior);

                            CON_MONEDA moneda = new CON_MONEDA();
                            moneda.setCon(con);           

                            double moneda_inflacionaria_mes_anterior = moneda.Buscar_Inflacionaria_Mes_Pasado(mes_anterior, ano_anterior);
                            detalle.setUFV_MES_PASADO(moneda_inflacionaria_mes_anterior);

                            double moneda_inflacionaria_actual = moneda.Buscar_Inflacionaria_actual();                        
                            detalle.setUFV_ACTUAL(moneda_inflacionaria_actual);

                            double actualizacion = ((saldo_mes_anterior/moneda_inflacionaria_mes_anterior)*moneda_inflacionaria_actual)-saldo_mes_anterior;            
                            detalle.setACTUALIZACION(actualizacion);

                            double sub_total = saldo_mes_anterior+actualizacion;            
                            detalle.setSUB_TOTAL(sub_total);

                            double saldo_total_a_favor_empleado = saldo_favor_empleado+sub_total;            
                            detalle.setSALDO_TOTAL_FAVOR_EMPLEADO(saldo_total_a_favor_empleado);

                            double saldo_utilizado=0.0;            
                            if(saldo_total_a_favor_empleado>saldo_favor)
                                saldo_utilizado=saldo_favor;
                            else
                                saldo_utilizado=saldo_total_a_favor_empleado;

                            detalle.setSALDO_UTILIZADO(saldo_utilizado);

                            double impuesto_retenido_pagar=0.0;            
                            if(saldo_total_a_favor_empleado<saldo_favor)
                            impuesto_retenido_pagar=saldo_favor-saldo_total_a_favor_empleado;

                            detalle.setIMPUESTO_RETENIDO_PAGAR(impuesto_retenido_pagar);

                            double saldo_favor_sigte_mes=0.0;
                            if(saldo_total_a_favor_empleado>saldo_favor)
                            saldo_favor_sigte_mes=saldo_total_a_favor_empleado-saldo_utilizado;

                            detalle.setSALDO_FAVOR_SIGUIENTE_MES(saldo_favor_sigte_mes);                       

                            double total_desc_mes = total_aporte_laboral+impuesto_retenido_pagar;//(falta atraso, faltas, sanciones, deuda celular)            
                            detalle.setTOTAL_DESCUENTO_MES(total_desc_mes);                      

                            double total_liquido_pagable =monto_pagar-total_desc_mes;            
                            detalle.setTOTAL_LIQUIDO_PAGABLE(total_liquido_pagable);                
                            detalle.Insertar();
                        }
                    }
                }            
                con.commit();
                return "";
            }
            else
            {
                return "-1";
            }            
        }
        catch(SQLException e)
        {
            con.rollback();
            return "-1";
        }
    }

    private String calcular_fila(HttpServletRequest request, Conexion con) throws SQLException {
        int id_planilla = Integer.parseInt(request.getParameter("id_planilla"));
        int ano = Integer.parseInt(request.getParameter("ano"));                
        int cantidad_pagos = Integer.parseInt(request.getParameter("cantidad_pagos"));
        double computo_iva = Double.parseDouble(request.getParameter("computo_iva"));
        double saldo_mes_anterior = Double.parseDouble(request.getParameter("saldo_mes_anterior"));
        double ufv_mes_anterior = Double.parseDouble(request.getParameter("ufv_mes_anterior"));
        double ufv_actual = Double.parseDouble(request.getParameter("ufv_actual"));
        
        String html = "";
        RHH_PLANILLA_PRIMA detalle = new RHH_PLANILLA_PRIMA(con).Buscar(id_planilla);
        RHH_PERSONA per = new RHH_PERSONA(con).BuscarxID_Usuario(detalle.getID_USUARIO());
        RHH_USUARIO usr = new RHH_USUARIO(con).BuscarXid(detalle.getID_USUARIO());
        List<RHH_EVENTOS_HITO> evento_list = new RHH_EVENTOS_HITO(con).TodosRetiro();        
        if (detalle != null) {            
            RHH_PLANILLA_PRIMA_CABECE planilla = new RHH_PLANILLA_PRIMA_CABECE(con).Buscar(detalle.getID_PRIMA_CABECERA());            
            html += "<td>" + per.getCI() + "</td>";
            html += "<td>" + per.getLUGAR_EMISION() + "</td>";
            html += "<td>" + per.getPRIMER_NOMBRE() + " " + per.getSEGUNDO_NOMBRE() + "</td>";
            html += "<td>" + per.getPRIMER_APELLIDO() + "</td>";
            html += "<td>" + per.getSEGUNDO_APELLIDO() + "</td>";
            html += "<td>" + detalle.getFECHA_INGRESO() + "</td>";
            if (detalle.getFECHA_RETIRO() != null) {
                html += "<td>" + detalle.getFECHA_RETIRO() + "</td>";
            } else {
                html += "<td></td>";
            }
            html += "<td>" + detalle.getANTIGUEDAD_DIA() + "</td>";
            html += "<td>" + detalle.getANTIGUEDAD_MES() + "</td>";
            html += "<td>" + detalle.getANTIGUEDAD_ANO() + "</td>";
            String cargo = detalle.getCARGO();
            cargo = cargo==null?"":cargo;
            html += "<td>" + cargo + "</td>";
            
            String depto = "***";
            int id_deto=detalle.getDEPARTAMENTO();
            if(id_deto!=0)
                depto = new RHH_DEPARTAMENTO(con).BuscarXid(id_deto).getDESCRIPCION();
            html += "<td>" + depto + "</td>";

            String reg = "***";
            int id_reg=detalle.getREGIONAL();
            if(id_reg!=0)
                reg = new RHH_REGIONAL(con).BuscarXid(id_deto).getDESCRIPCION();                
            html += "<td>" + reg + "</td>";

            String suc = "***";
            int id_suc=detalle.getSUCURSAL();
            if(id_suc!=0)
                suc = new RHH_SUCURSAL(con).BuscarXid(id_deto).getDESCRIPCION();                
            html += "<td>" + suc + "</td>";

            html += "<td>" + detalle.getMESES_TRABAJADOS_ANO_ACTUAL() + "</td>";
            html += "<td>" + detalle.getDIAS_TRABAJADOS_ANO_ACTUAL() + "</td>";
            if(planilla.getESTADO()!=0)
                html += "<td><input type='number' value='" + cantidad_pagos + "' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");'/></td>";                
            else
                html += "<td>" + cantidad_pagos + "</td>";
            
            detalle.setCANTIDAD_PAGOS(cantidad_pagos);
            
            double monto_total= detalle.getMONTO()*cantidad_pagos;
            
            html += "<td>" + detalle.getMONTO()+ "</td>";
            html += "<td>" + monto_total + "</td>";
            detalle.setMONTO_TOTAL(monto_total);
            
            double total_ganado_sin_imp = monto_total;
            double porc_largo_plazo=0.0;
            int usuario_estado = usr.getESTADO();
            CON_DATOS_EMPRESA datos_empresa= new CON_DATOS_EMPRESA(con).Buscar();
            
            if(usuario_estado==0||usuario_estado==1)
                porc_largo_plazo = datos_empresa.getPORCENTAJE_LARGO_PLAZO();
            if(usuario_estado==3 ||usuario_estado==4)
                porc_largo_plazo = datos_empresa.getPORCENTAJE_JUBILADOS();

            double seguro_largo_plazo=total_ganado_sin_imp*(porc_largo_plazo/100);            
            detalle.setSEGURO_LARGO_PLAZO(seguro_largo_plazo);
                        
            double porc_riesgo_comun = datos_empresa.getPORCENTAJE_RIESGO_COMUN();
            double riesgo_comun=total_ganado_sin_imp*(porc_riesgo_comun/100);            
            detalle.setRIESGO_COMUN(riesgo_comun);

            double porc_afp = datos_empresa.getPORCENTAJE_COMISION_AFP();
            double afp=total_ganado_sin_imp*(porc_afp/100);            
            detalle.setCOMISION_AFP(afp);

            double porc_solidario_asegurado = datos_empresa.getPORCENTAJE_SOLIDARIO();
            double solidario_asegurado=total_ganado_sin_imp*(porc_solidario_asegurado/100);            
            detalle.setSOLIDARIO_ASEGURADO(solidario_asegurado);

            double monto_SNA = datos_empresa.getMONTO_SOLIDARIO_NAC_A();
            double monto_SNB = datos_empresa.getMONTO_SOLIDARIO_NAC_B();
            double monto_SNC = datos_empresa.getMONTO_SOLIDARIO_NAC_C();
            double porc_SNA = datos_empresa.getPORCENTAJE_SOLIDARIO_NAC_A();
            double porc_SNB = datos_empresa.getPORCENTAJE_SOLIDARIO_NAC_B();
            double porc_SNC = datos_empresa.getPORCENTAJE_SOLIDARIO_NAC_C();

            double solidarion_nacional=0.0;

            if(total_ganado_sin_imp>=monto_SNA && total_ganado_sin_imp<monto_SNB)
            {
                solidarion_nacional=(total_ganado_sin_imp-monto_SNA)*(porc_SNA/100);
            }
            if(total_ganado_sin_imp>=monto_SNB&&total_ganado_sin_imp<monto_SNC)
            {
                solidarion_nacional=(total_ganado_sin_imp-monto_SNA)*(porc_SNA/100);
                solidarion_nacional+=(total_ganado_sin_imp-monto_SNB)*(porc_SNB/100);
            }
            if(total_ganado_sin_imp>=monto_SNC)
            {
                solidarion_nacional=(total_ganado_sin_imp-monto_SNA)*(porc_SNA/100);
                solidarion_nacional+=(total_ganado_sin_imp-monto_SNB)*(porc_SNB/100);
                solidarion_nacional+=(total_ganado_sin_imp-monto_SNC)*(porc_SNC/100);
            }

            detalle.setSOLIDARIO_NACIONAL(solidarion_nacional);

            Double total_aporte_laboral = seguro_largo_plazo+riesgo_comun+afp+solidario_asegurado+solidarion_nacional;            
            detalle.setTOTAL_APORTE_LABORAL(total_aporte_laboral);

            double porc_csbp = datos_empresa.getPORCENTAJE_CSBP_SEG_MED();
            double csbp=total_ganado_sin_imp*(porc_csbp/100);            
            detalle.setCSBP(csbp);

            double porc_afp_pro = datos_empresa.getPORCENTAJE_RISEGO_PROFESIONAL();
            double afp_pro=total_ganado_sin_imp*(porc_afp_pro/100);            
            detalle.setRIESGO_PROFESIONAL(afp_pro);

            double porc_aporte_pro = datos_empresa.getPORCENTAJE_APORTE_PRO();
            double aporte_pro=total_ganado_sin_imp*(porc_aporte_pro/100);            
            detalle.setPRO_VIVIENDA(aporte_pro);

            double porc_aporte_solidario = datos_empresa.getPORCENTAJE_SOLIDARIO();
            double aporte_solidario=total_ganado_sin_imp*(porc_aporte_solidario/100);            
            detalle.setAPORTE_SOLIDARIO(aporte_solidario);

            double total_aporte_patronal = csbp+afp_pro+aporte_pro+aporte_solidario;            
            detalle.setTOTAL_APORTE_PATRONAL(total_aporte_patronal);

            double salario_neto_sujeto_imp = total_ganado_sin_imp-total_aporte_laboral;            
            detalle.setMONTO_NETO_SUJ_IMPUESTOS(salario_neto_sujeto_imp);
            
            double salariominimo_nal = new RHH_SALARIO_MINIMO(con).salarioActual();
            double minimo_moinmp=salariominimo_nal*2;

            if(minimo_moinmp>=salario_neto_sujeto_imp)
                minimo_moinmp=salario_neto_sujeto_imp;            
            detalle.setMINIMO_NO_IMPONIBLE(minimo_moinmp);

            double dif_sujeta_impuestos= salario_neto_sujeto_imp-minimo_moinmp;            
            detalle.setDIFERENCIA_SUJETA_IMPUESTOS(dif_sujeta_impuestos);

            double imp_liquidado = dif_sujeta_impuestos*0.13;            
            detalle.setIMPUESTO_LIQUIDADO(imp_liquidado);

            double computo_iva_ddj=computo_iva;
            detalle.setCOMPUTO_IVA(computo_iva_ddj);

            double sobre_dos_salarios_minimos= 0.0;
            if(dif_sujeta_impuestos!=0)
            {
                if(imp_liquidado<(0.13*(salariominimo_nal*2)))
                    sobre_dos_salarios_minimos=imp_liquidado;
                else
                    sobre_dos_salarios_minimos=(0.13*(salariominimo_nal*2));
            }            
            detalle.setSOBRE_2_SALARIOS_MINIMOS(sobre_dos_salarios_minimos);


            double saldo_favor =0.0;
            if((imp_liquidado-computo_iva_ddj-sobre_dos_salarios_minimos)<0)
                saldo_favor=0.0;
            else
                saldo_favor=(imp_liquidado-computo_iva_ddj-sobre_dos_salarios_minimos);            
            detalle.setSALDO_FAVOR_IMPUESTOS(saldo_favor);

            double saldo_favor_empleado=0.0;
            if(sobre_dos_salarios_minimos>imp_liquidado)
                saldo_favor_empleado=0.0;
            else
            {
                if(sobre_dos_salarios_minimos+computo_iva_ddj-imp_liquidado<0)
                    saldo_favor_empleado=0.0;
                else
                    saldo_favor_empleado=sobre_dos_salarios_minimos+computo_iva_ddj-imp_liquidado;
            }            
            detalle.setSALDO_FAVOR_EMPLEADOS(saldo_favor_empleado);

            Calendar fecha_anterior = new GregorianCalendar();
            fecha_anterior.add(Calendar.MONTH, -1);
            int ano_anterior=fecha_anterior.get(Calendar.YEAR);
            int mes_anterior=fecha_anterior.get(Calendar.MONTH)+1;
            RHH_PLANILLA_EMPLEADOS planilla_anterior=new RHH_PLANILLA_EMPLEADOS(con).BuscarxUSUARIO(ano_anterior, mes_anterior, usr.getID());
                        
            detalle.setSALDO_MES_ANTERIOR(saldo_mes_anterior);

            CON_MONEDA moneda = new CON_MONEDA();
            moneda.setCon(con);           

            double moneda_inflacionaria_mes_anterior = ufv_mes_anterior;
            detalle.setUFV_MES_PASADO(moneda_inflacionaria_mes_anterior);

            double moneda_inflacionaria_actual = ufv_actual;
            detalle.setUFV_ACTUAL(moneda_inflacionaria_actual);

            double actualizacion = ((saldo_mes_anterior/moneda_inflacionaria_mes_anterior)*moneda_inflacionaria_actual)-saldo_mes_anterior;            
            detalle.setACTUALIZACION(actualizacion);

            double sub_total = saldo_mes_anterior+actualizacion;            
            detalle.setSUB_TOTAL(sub_total);

            double saldo_total_a_favor_empleado = saldo_favor_empleado+sub_total;            
            detalle.setSALDO_TOTAL_FAVOR_EMPLEADO(saldo_total_a_favor_empleado);

            double saldo_utilizado=0.0;            
            if(saldo_total_a_favor_empleado>saldo_favor)
                saldo_utilizado=saldo_favor;
            else
                saldo_utilizado=saldo_total_a_favor_empleado;

            detalle.setSALDO_UTILIZADO(saldo_utilizado);

            double impuesto_retenido_pagar=0.0;            
            if(saldo_total_a_favor_empleado<saldo_favor)
            impuesto_retenido_pagar=saldo_favor-saldo_total_a_favor_empleado;

            detalle.setIMPUESTO_RETENIDO_PAGAR(impuesto_retenido_pagar);

            double saldo_favor_sigte_mes=0.0;
            if(saldo_total_a_favor_empleado>saldo_favor)
            saldo_favor_sigte_mes=saldo_total_a_favor_empleado-saldo_utilizado;

            detalle.setSALDO_FAVOR_SIGUIENTE_MES(saldo_favor_sigte_mes);                       

            double total_desc_mes = total_aporte_laboral+impuesto_retenido_pagar;//(falta atraso, faltas, sanciones, deuda celular)            
            detalle.setTOTAL_DESCUENTO_MES(total_desc_mes);                      

            double total_liquido_pagable =total_ganado_sin_imp-total_desc_mes;            
            detalle.setTOTAL_LIQUIDO_PAGABLE(total_liquido_pagable);     

            html+="<td>"+detalle.getSEGURO_LARGO_PLAZO()+"</td>";
            html+="<td>"+detalle.getRIESGO_COMUN()+"</td>";
            html+="<td>"+detalle.getRIESGO_PROFESIONAL()+"</td>";
            html+="<td>"+detalle.getSOLIDARIO_ASEGURADO()+"</td>";
            html+="<td>"+detalle.getSOLIDARIO_NACIONAL()+"</td>";
            html+="<td>"+detalle.getTOTAL_APORTE_LABORAL()+"</td>";
            html+="<td>"+detalle.getCSBP()+"</td>";
            html+="<td>"+detalle.getRIESGO_PROFESIONAL()+"</td>";
            html+="<td>"+detalle.getPRO_VIVIENDA()+"</td>";
            html+="<td>"+detalle.getAPORTE_SOLIDARIO()+"</td>";
            html+="<td>"+detalle.getTOTAL_APORTE_PATRONAL()+"</td>";
            html+="<td>"+detalle.getMONTO_NETO_SUJ_IMPUESTOS()+"</td>";
            html+="<td>"+detalle.getMINIMO_NO_IMPONIBLE()+"</td>";
            html+="<td>"+detalle.getDIFERENCIA_SUJETA_IMPUESTOS()+"</td>";
            html+="<td>"+detalle.getIMPUESTO_LIQUIDADO()+"</td>";            
            html+="<td><input type='number' data-id='"+detalle.getID()+"' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");' value='"+detalle.getCOMPUTO_IVA()+"' min='0'/> </td>";
            html+="<td>"+detalle.getSOBRE_2_SALARIOS_MINIMOS()+"</td>";
            html+="<td>"+detalle.getSALDO_FAVOR_IMPUESTOS()+"</td>";
            html+="<td>"+detalle.getSALDO_FAVOR_EMPLEADOS()+"</td>";
            html+="<td><input type='number' data-id='"+detalle.getID()+"' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");' value='"+detalle.getSALDO_MES_ANTERIOR()+"' min='0'/></td>";
            html+="<td><input type='number' data-id='"+detalle.getID()+"' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");' value='"+detalle.getUFV_MES_PASADO()+"' min='0'/></td>";
            html+="<td><input type='number' data-id='"+detalle.getID()+"' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");' value='"+detalle.getUFV_ACTUAL()+"' min='0'/></td>";             
            html+="<td>"+detalle.getACTUALIZACION()+"</td>";                
            html+="<td>"+detalle.getSUB_TOTAL()+"</td>";
            html+="<td>"+detalle.getSALDO_TOTAL_FAVOR_EMPLEADO()+"</td>";               
            html+="<td>"+detalle.getSALDO_UTILIZADO()+"</td>";                
            html+="<td>"+detalle.getIMPUESTO_RETENIDO_PAGAR()+"</td>";                
            html+="<td>"+detalle.getSALDO_FAVOR_SIGUIENTE_MES()+"</td>";                
            html+="<td>"+detalle.getTOTAL_DESCUENTO_MES()+"</td>";                
            html+="<td>"+detalle.getTOTAL_LIQUIDO_PAGABLE()+"</td>";        
            detalle.Modificar();
        }           
        return html;
    }

    private String eliminar(HttpServletRequest request, Conexion con) throws SQLException {
        int id_planilla=Integer.parseInt(request.getParameter("id_planilla"));
        RHH_PLANILLA_PRIMA_CABECE cab = new RHH_PLANILLA_PRIMA_CABECE(con);
        cab.setID(id_planilla);
        cab.EliminarXid();
        return true+"";
    }

    private String estado(HttpServletRequest request, Conexion con) throws SQLException {
        int id = Integer.parseInt(request.getParameter("id_planilla"));
        RHH_PLANILLA_PRIMA planilla = new RHH_PLANILLA_PRIMA(con).Buscar(id);
        if(planilla.getESTADO_PENDIENTES_PRIMA()==1)
            planilla.cambiarEstado(0);
        else
            planilla.cambiarEstado(1);
        return true+"";
    }
        
}
